﻿// demo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
void callBack(int, void*);
void xaunzhuan();

Mat duibidu(Mat);
Mat src = imread("000.png");
Mat hsv,dst;

string windowName = "src";
string dstName = "dst";
 

//色相  
int hmin =60;//h分量提取下限
int hmax = 124;//h分量提取上限
int h_Max = 124; //h分量可取的最大值
//饱和度  
int smin = 43;//s分量提取下限
int smax = 255;//s分量提取上限
int s_Max = 255;//s分量可取的最大值
//亮度  
int vmin = 46;//v分量提取下限
int vmax = 255;//v分量提取上限
int v_Max = 255;//v分量可取的最大值


int main()
{
	Mat bgr=src;
	//颜色空间转换  
	cvtColor(bgr, hsv, COLOR_BGR2HSV);

	namedWindow(dstName, CV_WINDOW_AUTOSIZE);
	//调节色相 H  
	createTrackbar("hmin", dstName, &hmin, h_Max, callBack);
	createTrackbar("hmax", dstName, &hmax, h_Max, callBack);
	//调节饱和度 S  
	createTrackbar("smin", dstName, &smin, s_Max, callBack);
	createTrackbar("smax", dstName, &smax, s_Max, callBack);
	//调节亮度 V  
	createTrackbar("vmin", dstName, &vmin, v_Max, callBack);
	createTrackbar("vmax", dstName, &vmax, v_Max, callBack);


	callBack(0, 0);
	Mat _dst;
	
	//得出刀子
	Mat element1 = getStructuringElement(MORPH_RECT, Size(50, 1));
	erode(dst, dst, element1);
	imshow("腐蚀后", dst);
	Mat element2 = getStructuringElement(MORPH_RECT, Size(50, 2));
	dilate(dst, dst, element2);
	imshow("膨胀效果图", dst);
	medianBlur(dst, dst, 7);
	imshow("去噪", dst);


	//得出雨伞






waitKey(0);

}

void callBack(int, void*) {
	dst = Mat::zeros(src.size(), src.type());
	//遮罩 
	Mat mask;
	inRange(hsv, Scalar(hmin, smin, vmin), Scalar(hmax, smax, vmax), mask);

	//只保留  
	for (int r = 0; r < src.rows; r++)
	{
		for (int c = 0; c < src.cols; c++)
		{
			if (mask.at<uchar>(r, c) == 255)
			{
				dst.at<Vec3b>(r, c)[0] = src.at<Vec3b>(r, c)[0];
				dst.at<Vec3b>(r, c)[1] = src.at<Vec3b>(r, c)[1];
				dst.at<Vec3b>(r, c)[2] = src.at<Vec3b>(r, c)[2];
			}
		}
	}
	imshow("mask", mask);
	//输出图像  
	imshow("dst", dst);
}

void xuanzhuan() {

}





// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门提示: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
